Client Code   . Generated .            libgccjit.so
              . code      .
              .           . JIT API  . JIT "Frontend". (libbackend.a)
....................................................................................
   │          .           .          .               .
    ──────────────────────────>      .               .
              .           .    │     .               .
              .           .    V     .               .
              .           .    ──> libgccjit.c       .
              .           .        │ (error-checking).
              .           .        │                 .
              .           .        ──> jit-recording.c
              .           .              (record API calls)
              .           .    <───────              .
              .           .    │     .               .
   <───────────────────────────      .               .
   │          .           .          .               .
   │          .           .          .               .
   V          .           .  gcc_jit_context_compile .
    ──────────────────────────>      .               .
              .           .    │ start of recording::context::compile ()
              .           .    │     .               .
              .           .    │ start of playback::context::compile ()
              .           .    │   (create tempdir)  .
              .           .    │     .               .
              .           .    │ ACQUIRE MUTEX       .
              .           .    │     .               .
              .           .    V───────────────────────> toplev::main (for now)
              .           .          .               .       │
              .           .          .               .   (various code)
              .           .          .               .       │
              .           .          .               .       V
              .           .          .    <───────────────── langhook:parse_file
              .           .          .    │          .
              .           .          .    │ (jit_langhook_parse_file)
              .           .          .    │          .
..........................................│..................VVVVVVVVVVVVV...
              .           .          .    │          .       No GC in here
              .           .          .    │ jit-playback.c
              .           .          .    │   (playback of API calls)
              .           .          .    ───────────────> creation of functions,
              .           .          .               .     types, expression trees
              .           .          .    <──────────────── etc
              .           .          .    │(handle_locations: add locations to
              .           .          .    │ linemap and associate them with trees)
              .           .          .    │          .
              .           .          .    │          .       No GC in here
..........................................│..................AAAAAAAAAAAAA...
              .           .          .    │ for each function
              .           .          .    ──> postprocess
              .           .          .        │      .
              .           .          .        ────────────> cgraph_finalize_function
              .           .          .        <────────────
              .           .          .     <──       .
              .           .          .    │          .
              .           .          .    ──────────────────> (end of
              .           .          .               .       │ langhook_parse_file)
              .           .          .               .       │
              .           .          .               .   (various code)
              .           .          .               .       │
              .           .          .               .       ↓
              .           .          .    <───────────────── langhook:write_globals
              .           .          .    │          .
              .           .          .    │ (jit_langhook_write_globals)
              .           .          .    │          .
              .           .          .    │          .
              .           .          .    ──────────────────> finalize_compilation_unit
              .           .          .               .       │
              .           .          .               .   (the middle─end and backend)
              .           .          .               .       ↓
              .           .    <───────────────────────────── end of toplev::main
              .           .    │     .               .
              .           .    V───────────────────────> toplev::finalize
              .           .          .               . │   (purge internal state)
              .           .    <──────────────────────── end of toplev::finalize
              .           .    │     .               .
              .           .    V─> playback::context::postprocess:
              .           .      │   .               .
              .           .      │   (assuming an in-memory compile):
              .           .      │   .               .
              .           .      │   . Convert assembler to DSO ("fake.so")
              .           .      │   .               .
              .           .      │   . Load DSO (dlopen "fake.so")
              .           .      │   .               .
              .           .      │   . Bundle it up in a jit::result
              .           .    <──   .               .
              .           .    │     .               .
              .           .    │ RELEASE MUTEX       .
              .           .    │     .               .
              .           .    │ end of playback::context::compile ()
              .           .    │     .               .
              .           .    │ playback::context dtor
              .           .     ──>  .               .
              .           .       │ Normally we cleanup the tempdir here:
              .           .       │   ("fake.so" is unlinked from the
              .           .       │    filesystem at this point)
              .           .       │ If the client code requested debuginfo, the
              .           .       │ cleanup happens later (in gcc_jit_result_release)
              .           .       │ to make it easier on the debugger (see PR jit/64206)
              .           .    <──   .               .
              .           .    │     .               .
              .           .    │ end of recording::context::compile ()
   <───────────────────────────      .               .
   │          .           .          .               .
   V          .           .  gcc_jit_result_get_code .
    ──────────────────────────>      .               .
              .           .    │ dlsym () within loaded DSO
   <───────────────────────────      .               .
   Get (void*).           .          .               .
   │          .           .          .               .
   │ Call it  .           .          .               .
   ───────────────>       .          .               .
              .    │      .          .               .
              .    │      .          .               .
   <───────────────       .          .               .
   │          .           .          .               .
etc│          .           .          .               .
   │          .           .          .               .
   V          .           .  gcc_jit_result_release  .
    ──────────────────────────>      .               .
              .           .    │ dlclose () the loaded DSO
              .           .    │    (code becomes uncallable)
              .           .    │     .               .
              .           .    │ If the client code requested debuginfo, then
              .           .    │ cleanup of the tempdir was delayed.
              .           .    │ If that was the case, clean it up now.
   <───────────────────────────      .               .
   │          .           .          .               .
